package Enums;

/**
 * enum 定义的枚举类默认继承了 java.lang.Enum 类，并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口
 */
public class EnumsTest {

    /**
     * 内部类中使用枚举 
     * 所有的枚举值都是 public static final
    */
    enum Color1
    {
        RED, GREEN, BLUE;
    }

    /**
     * 枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义
     */
    public static void Show()
    {
        /**
         * Color1
         */
        System.out.println("**********Color1**************");
        Color1 c1 = Color1.RED;
        System.out.println(c1);
        //使用 valueOf() 返回枚举常量，不存在的会报错 IllegalArgumentException
        System.out.println(Color1.valueOf("RED"));

        /**
         * Color2
         */
        System.out.println("**********Color2 switch**************");
        var typeEnum = Color2.BLANK;
        switch (typeEnum) {
            case RED:
                System.out.println("枚举名称(即默认自带的属性 name 的值)是：" + typeEnum.name());
                System.out.println("排序值(默认自带的属性 ordinal 的值)是：" + typeEnum.ordinal());//枚举常量的索引
                break;
            case GREEN:
                System.out.println("枚举名称(即默认自带的属性 name 的值)是：" + typeEnum.name());
                System.out.println("排序值(默认自带的属性 ordinal 的值)是：" + typeEnum.ordinal());
                break;
            case BLANK:
                System.out.println("枚举名称(即默认自带的属性 name 的值)是：" + typeEnum.name());
                System.out.println("排序值(默认自带的属性 ordinal 的值)是：" + typeEnum.ordinal());
                break;
            case YELLO:
                System.out.println("枚举名称(即默认自带的属性 name 的值)是：" + typeEnum.name());
                System.out.println("排序值(默认自带的属性 ordinal 的值)是：" + typeEnum.ordinal());
                break;
            default:
                System.out.println("default");
        }



        /**
         * Color3
         */
        System.out.println("**********Color3**************");
        System.out.println("---------遍历Color3---------");
        for (Color3 type : Color3.values()) {
            System.out.println("type = " + type + "    type.name = " + type.name() + "   typeName = " + type.getName() + "   ordinal = " + type.ordinal());
        }

        System.out.println(Color3.BLANK);//BLANK
        System.out.println(Color3.YELLO);//YELLO
        System.out.println(Color3.getName(2));//绿色

        Color3 color3 = Color3.BLANK;
        System.out.println(color3.getName());//黑色
        System.out.println(color3.getIndex());//3
        System.out.println(color3.name());//BLANK

        color3.setIndex(1);
        System.out.println(color3.getIndex());//1
        System.out.println(color3.getName());//黑色

        /**
         * Color4
         * 重写toString方法
         */
        System.out.println("**********Color4**************");
        System.out.println(Color4.BLANK);//3_黑色
        System.out.println(Color4.YELLO);//4_黄色

        Color4 color4 = Color4.BLANK;
        System.out.println(color4.name());//BLANK
        System.out.println(color4.toString());//3_黑色


        /**
         * Color5
         */
        System.out.println("**********Color5**************");
        Color5 c5 = Color5.RED;
        System.out.println(c5);
        c5.getInfo();
        c5.print();


        /**
        * Color6
        */
        System.out.println("**********Color6**************");
        Color6 c6 = Color6.RED;
        System.out.println(c6);
        c6.colorInfo();


        /**
        * Color7
        */
        System.out.println("**********Color7**************");
        Color7 c7 = Color7.RED;
        System.out.println(c7);
        c7.getColor();
    }
}
